/**
* Copyright (C) 2008 Happy Fish / YuQing
*
* FastDFS Java Client may be copied only under the terms of the GNU Lesser
* General Public License (LGPL).
* Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
**/

package com.hlf.common.oss.common;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;

/**
* ini file reader / parser
* @author Happy Fish / YuQing
* @version Version 1.0
*/
public class IniFileReader
{
    private Hashtable paramTable;
    private String conf_filename;

/**
* @param conf_filename config filename
*/
    public IniFileReader(String conf_filename) throws FileNotFoundException, IOException
    {
        this.conf_filename = conf_filename;
        loadFromFile(conf_filename);
    }

/**
* get the config filename
* @return config filename
*/
    public String getConfFilename()
    {
        return this.conf_filename;
    }

/**
* get string value from config file
* @param name item name in config file
* @return string value
*/
    public String getStrValue(String name)
    {
        Object obj;
        obj = this.paramTable.get(name);
        if (obj == null)
        {
            return null;
        }

        if (obj instanceof String)
        {
            return (String)obj;
        }

        return (String)((ArrayList)obj).get(0);
    }

/**
* get int value from config file
* @param name item name in config file
* @param default_value the default value
* @return int value
*/
    public int getIntValue(String name, int default_value)
    {
        String szValue = this.getStrValue(name);
        if (szValue == null)
        {
            return default_value;
        }

        return Integer.parseInt(szValue);
    }

/**
* get boolean value from config file
* @param name item name in config file
* @param default_value the default value
* @return boolean value
*/
    public boolean getBoolValue(String name, boolean default_value)
    {
        String szValue = this.getStrValue(name);
        if (szValue == null)
        {
            return default_value;
        }

        return szValue.equalsIgnoreCase("yes") || szValue.equalsIgnoreCase("on") ||
                     szValue.equalsIgnoreCase("true") || szValue.equals("1");
    }

/**
* get all values from config file
* @param name item name in config file
* @return string values (array)
*/
    public String[] getValues(String name)
    {
        Object obj;
        String[] values;

        obj = this.paramTable.get(name);
        if (obj == null)
        {
            return null;
        }

        if (obj instanceof String)
        {
            values = new String[1];
            values[0] = (String)obj;
            return values;
        }

        Object[] objs = ((ArrayList)obj).toArray();
        values = new String[objs.length];
        System.arraycopy(objs, 0, values, 0, objs.length);
        return values;
    }

    private void loadFromFile(String conf_filename) throws FileNotFoundException, IOException
    {
        FileReader fReader;
        BufferedReader buffReader;
        String line;
        String[] parts;
        String name;
        String value;
        Object obj;
        ArrayList valueList;

      fReader = new FileReader(conf_filename);
      buffReader = new BufferedReader(fReader);
      this.paramTable = new Hashtable();

      try
      {
          while ((line=buffReader.readLine()) != null)
          {
              line = line.trim();
              if (line.length() == 0 || line.charAt(0) == '#')
              {
                  continue;
              }

              parts = line.split("=", 2);
              if (parts.length != 2)
              {
                  continue;
              }

              name = parts[0].trim();
              value = parts[1].trim();

              obj = this.paramTable.get(name);
              if (obj == null)
              {
                  this.paramTable.put(name, value);
              }
              else if (obj instanceof String)
              {
                  valueList = new ArrayList();
                  valueList.add(obj);
                  valueList.add(value);
                  this.paramTable.put(name, valueList);
              }
              else
              {
                  valueList = (ArrayList)obj;
                  valueList.add(value);
              }
          }
      }
      finally
      {
          fReader.close();
      }
  }  
}
